﻿#ifndef _CELLTASK_HPP_
#define _CELLTASK_HPP_

#include <thread>
#include <mutex>
#include <list>
#include <functional>
#include "CELLThread.hpp"

// 执行任务的服务类型
class CellTaskServer
{
private:
	// 定义要添加的任务的类型，传递的是匿名函数lambda表达式
	typedef std::function<void()> CellTask;
public:
	CellTaskServer() :  serverId(-1)
	{

	}

	~CellTaskServer()
	{

	}

	// 添加任务到缓冲区
	void AddTask(const CellTask task)
	{
		std::lock_guard<std::mutex> lock(_mutex);
		_tasksBuf.push_back(task);
	}

	// 启动工作线程
	void Start()
	{
		_thread.Start(nullptr, [this](CELLThread* pthread) {
			OnRun(pthread);
		});
	}

	void Close()
	{
		// CELLLog::Info("CELLTaskServer %d Close begin", serverId);
		_thread.Close();
		// CELLLog::Info("CELLTaskServer %d Close end", serverId);
	}

	// 所属CELLServer的id
	int serverId;
protected:
	// 工作函数
	void OnRun(CELLThread* pthread)
	{
		while (pthread->isRun())
		{
			// 如果任务缓冲区有任务数据
			if (!_tasksBuf.empty())
			{
				// 从缓冲区取出数据加入任务数据
				std::lock_guard<std::mutex> lock(_mutex);
				for (auto pTask : _tasksBuf)
				{
					_tasks.push_back(pTask);
				}
				// 添加完以后记得清掉，不然下次又添加进去了，但是任务处理完清除了内存
				_tasksBuf.clear();
			}

			// 如果没有任务数据，睡眠1毫秒跳过此次循环
			if (_tasks.empty())
			{
				std::chrono::milliseconds t(1);
				std::this_thread::sleep_for(t);
				continue;
			}

			// 处理任务
			for (auto pTask : _tasks)
			{
				pTask();
			}

			// 清空任务
			_tasks.clear();
		}
		// CELLLog::Info("CELLTaskServer %d OnRun exit", serverId);
		// 退出前处理缓冲队列中的任务
		for (auto pTask : _tasksBuf)
		{
			pTask();
		}
	}
private:
	// 任务数据
	std::list<CellTask> _tasks;
	// 任务数据缓冲区
	std::list<CellTask> _tasksBuf;
	// 任务数据缓冲区的锁
	std::mutex _mutex;
	//
	CELLThread _thread;
};

#endif
